lexer grammar CLexer;

options {
  language = Java;
}

@lexer::header{
 package ejercicio4;
}

@lexer::members {
      //Lista que guarda los errores que se van produciendo durante el analisis lexico
    List<RecognitionException> errors = new ArrayList<RecognitionException>();

    //Metodo que devuelve la lista de errores que se han producido
    public List<RecognitionException> getAllErrors() {
        return errors;
    }
    
    //Metodo que comprueba si se han producido errores
    public boolean hasErrors() {
        return !errors.isEmpty();
    }

    //Metodo del analizador lexico sobrescrito para que los errores que se van
    //produciendo durante el analisis lexico en vez de mostrarse por consola
    //se guarden en la lista de errores (errors)
    @Override
    public void reportError(RecognitionException e) {
        errors.add(e);
    }
}

BLANCO : (' '|'\t'|'\r'?'\n') {$channel=HIDDEN;};

IF : 'if';
BREAK : 'break';
WHILE : 'while';
VOID : 'void';
INT : 'int';

fragment PARENT_AB : '(';
fragment PARENT_CER : ')';
fragment LLAVE_AB : '{';
fragment LLAVE_CER : '}';
fragment SUMA : '+';
fragment RESTA : '-';
fragment MUL : '*';
fragment DIV : '/';
fragment MENOR : '<';
fragment MAYOR : '>';
fragment COMILLAS : '"';

IGUAL : '=';

fragment MENOR_IGUAL : MENOR IGUAL;
fragment MAYOR_IGUAL : MAYOR IGUAL;

COMPARADORES : MENOR | MAYOR | MENOR_IGUAL | MAYOR_IGUAL;

LETRA : ('a'..'z') | ('A'..'Z');
fragment DIGITO : ('0'..'9');
NUMERO : (DIGITO)+('.'(DIGITO)+)?;
IDENT : (LETRA)(DIGITO|LETRA)+;
OPERADORES : SUMA | RESTA | DIV | MUL;

PARENTESIS : PARENT_AB | PARENT_CER ;
SEPARADOR : ';' ;
LLAVES : LLAVE_AB | LLAVE_CER;

COMENTARIO: '/*' (options {greedy=false;}:.)* '*/' {$channel=HIDDEN;};
CADENA : COMILLAS (options {greedy=false;}:.)* COMILLAS;

COMA : ',';